//{[(([{}]))]}
// 匹配括号是否成对

#include <stdio.h>
#include <stdbool.h>

// 定义一个顺序栈====================================
#define MaxSize 20
typedef char DataType;
typedef struct
{
    DataType data[MaxSize];
    int top;
} Stack;

// 空栈
bool isEmpty(Stack *s)
{
    if (s->top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
// 进栈
bool push(Stack *s, DataType data)
{
    if (s->top == MaxSize - 1)
    {
        return false; // 栈已经满了
    }
    s->data[++s->top] = data;
    return true;
}
// 出栈
bool pop(Stack *s, DataType *data)
{
    if (s->top == -1)
    {
        return false; // 栈为空
    }
    *data = s->data[s->top--];

    return true;
}
// 获得栈顶元素
DataType getTopData(Stack *s)
{
    if (s->top == -1)
    {
        return false; // 栈为空
    }
    return s->data[s->top];
}

// 定义处理括号函数
bool bracketCheck(DataType str[])
{
    // 创建栈,初始化
    Stack s;
    s.top = -1;
    int i = 0;
    DataType temp;
    while (str[i] != '\0')
    {
        if (str[i] == '{' || str[i] == '[' || str[i] == '(')
        {
            push(&s, str[i]);
        }
        else
        {
            pop(&s, &temp);
            if (temp == '{' && str[i] != '}')
            {
                return false;
            }
            if (temp == '[' && str[i] != ']')
            {
                return false;
            }
            if (temp == '(' && str[i] != ')')
            {
                return false;
            }
        }
        i++;
    }
    return isEmpty(&s);
}

int main()
{
    DataType str[] = "({[({})]})";
    if(bracketCheck(str)==1){
        printf("匹配成功!");
    }else{
        printf("匹配失败!");
    }
    return 0;
}